在上一篇瞭解了如何建制一個專案之後,和我們之後要使用psake作為build tool,在這篇我們將會看到底怎麼開始使用psake,和建立出我們之後會一直使用的專案。
(之後下面提到的code都可以從這邊看到內容:github repo,這篇會是tag sample/chapter4)
同步發表於我的部落格:http://blog.alantsai.net/2016/12/devopsSeries-psakeIntro.html (部落格的格式會漂亮一些,ithome不支援html好不方便)
psake是一個powershell的module,因此,除了psake的module檔案需要下載之外,在Windows不需要在做什麼其他安裝和設定。
安裝psake到電腦裡面其實很簡單,只需要到psake的github repo下載下來,然後在powershell裡面呼叫Import-Module .\psake.psm1,那麼psake就好了。
當然,還需要這個下載動作好麻煩,從專案角度來說,難道我需要要求所有開發者都需要自己做這件事情嗎?那不是很麻煩
非常好的是,psake有提供nuget版本,因此我們可以用nuget來把psake鍵入到專案裡面(如果想裝在電腦裡,可以透過chocolatey來方便安裝)
psake基本資訊
psake github repo:https://github.com/psake/psake
nuget:https://www.nuget.org/packages/psake/
nuget 安裝指令:Install-Package psake
說明文件:http://psake.readthedocs.io/en/latest/
chocolatey:https://chocolatey.org/packages/psake
chocolatey指令:choco install psake
瞭解基本資訊之後,我們就開始建立測試環境
我們就先建立一個Visual Studio的專案。以前,nuget是可以安裝在solution層級,但是後來改掉了,但是問題不大,我們可以建立一個C# Library用來記錄這個dependency。
接下來psake相關內容我們寫的其實都是powershell的語法 - 看個人使用,可以用powershell的ise來寫,或者用Visual Studio。
既然大家都是開發者,建議用Visual Studio - 可以安裝一個套件PowerShell Tools for Visual Studio, 未來debug什麼都可以直接在Visual studio做。甚至想寫單元測試都可以直接在上面跑。
powershell有個好處是,如果到時候到build server有問題,可以用上面的powershell ise來直接debug。
先建立一個C# Library的Project,把預設的Class1.cs刪掉,然後用nuget安裝psake:
建立一個檔案,然後把檔名取做default.ps1。(可以在新建檔案選class檔案,然後把檔名改掉):
然後我們貼上一下內容在default.ps1里面:
task Test -depends Compile, Clean {
Write-Host "Executed Test !"
}
task Compile -depends Clean {
Write-Host "Executed Compile !"
}
task Clean {
Write-Host "Executed Clean !"
}
開啟VS 裡面的 Powershell Interactive Windows(可以透過搜索右上角的Quick Launch快速找到)
Powershell Interactive Windows打開之後,先注意一下你的位置,記得要先CD進去有sake專案的位置下,然後執行下面語法(建議各位手動輸入,因為會發現很方便有intellisense)
Import-Module ..\packages\psake.4.6.0\tools\psake.psm1 - 這個動作是吧psake加入進來
Invoke-psake Test - 執行我們Test的這個Task
執行下去之後,會看到我們三個Task都執行了,並且我們寫的動作也執行了。
在這段會介紹剛剛我們準備的時候一些psake相關的資訊,並且在往下做一些延伸。
首先是檔名的部分。剛剛應該會注意到,執行psake的時候並沒有給他要執行那個檔案,但是他自動找到了。原因是預設他會找default.ps1這個檔案。
因此在任何一個psake檔案default.ps1都是進入點。
基本上 task 最少(或者最常見) 會定義幾個事情:
預設Task的定義 - 舉例來說,剛剛執行的時候要輸入Task名稱,但是有一個特殊的task,他的名字叫做 default,這個task只能有-depends 參數,並且沒有執行內容。這個就會是當invoke-psake沒有給task名稱所會執行的。舉例來說:task default -depends Test - 就會定義在 不給task名稱的情況下,預設要執行Test這個task
-description 參數 - 有時候光看Task名稱還不確定會做什麼,所以可以用參數-description給一個詳細說明。這個時候能夠在透過 Invoke-Psake -docs來看到整體的task。
目前我們在每個task的動作只是寫到console。假設今天我想寫到console的字可以自訂,就會使用到properties,舉例來說,我想定義每一個執行的時候顯示的訊息: 我就會先定義一個properties:
Properties{
$testMsg = "Executed Test !"
$compileMsg = "Executed Compile !"
$cleanMsg = "Executed Clean !"
}
然後對應的Write-Host改成用這些參數
當我要改變這些值的時候,在Invoke-Psake的時候就加上properties就好:Invoke-psake -properties @{testMsg="測試訊息"}
這邊注意到在外面呼叫的時候不需要錢字符($)
如果有些參數會影響到我們執行,可以直接在task裡面用-requiredVariables,然後variable名稱即可。有多個就用逗點分割。
這樣可以減少我們需要在執行中做檢測
到目前為止有多介紹了一些常用的task定義方式 - 在接下來,如果有些有在額外用到會在用到的時候說明。
在這篇結束以前,我們會發現到每一次執行psake都要先import-module,在執行其實是非常繁瑣,而且如果給另外一個工程師不懂powershell,可能光import module就卡死他了。
所以我們會在增加所謂的bootstrap script - 就是我們只要執行那個檔案,而那個檔案會把該做的都設定好。幫我們防呆。
所以,我會建立另外一個檔案,我叫做build.ps1,用作於每一次建制的時候執行。
裡面有的內容如下:
# 如果psake module有存在,先把他反註解
if (Get-Module -ListAvailable -Name psake) {
Remove-Module psake
}
# 找到psake module並且註冊
$psakeModulePath = (Get-ChildItem("..\packages\psake*\tools\psake.psm1")).FullName |
Sort-Object $_ | select -Last 1
if(Test-Path $psakeModulePath){
Import-Module $psakeModulePath
}else{
Write-Host "找不到psake module,請確認好nuget package有restore完成"
return
}
# 執行psake
Invoke-psake -buildFile .\default.ps1 -taskList Test `
-properties @{
"testMsg"="測試訊息"
}
希望透過這篇,對於psake如何定義和使用有了基本的概念。我們將會在接下來使用這個專案建制我們的build script。
在下篇,我們將會開始進入建制的部分,psake如何利用現有MSBuild有的資源作出我們要的建制環境。